/**
 * 
 * @param {给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。

    如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外，这两个数都不会以 0 开头。

    示例：

    输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出：7 -> 0 -> 8
    原因：342 + 465 = 807} l1 
 * @param {*} l2 
 */
let addTwoNumbers = function(l1, l2) {
    function add(lf, ls, other) {
        let fVal = lf == null ? {val: 0, next: null} : lf;
        let sVal = ls == null ? {val: 0, next: null} : ls;
        let sum = fVal.val + sVal.val + other;
        let curent = sum % 10;
        let nextVal = Math.floor(sum / 10);
        if(fVal.next != null || sVal.next != null) {
            return {
                val: curent,
                next:  add(fVal.next, sVal.next, nextVal)
            }
        } else {
            if(nextVal > 0) {
                return {
                    val: curent,
                    next:  {
                        val: nextVal,
                        next: null
                    }
                }
            } else {
                return {
                    val: curent,
                    next:  null
                }
            }
        }
    }
    return add(l1, l2, 0);
};

function run () {
    let args = [
        {
            val: 2,
            next: {
                val: 4,
                next: {
                    val: 3,
                    next: null
                }
            }
        },
        {
            val: 5,
            next: {
                val: 6,
                next: {
                    val: 4,
                    next: null
                }
            }
        }
    ];
    return addTwoNumbers(...args);
}
module.exports = run;